# ==== Purpose ====
#
# This include will insert some data into a table at the master after setting
# a debug sync point at the slave that should make the IO thread to stop in the
# middle of the transaction event stream (trying to let partial transactions in
# the relay log).
#
# After ensuring that the IO thread has stopped, this include will insert more
# data into the master table while the IO thread is stopped.
#
# Then, this include will start the slave IO thread again and wait for it to be
# synchronized with the master.
#
# If the SQL thread was running at the beginning of the include, it will sync
# the SQL thread after the insert/stop IO thread/insert sequence.
#
# ==== Usage ====
#
# --let $table= table_name
# --let $debug_point= debug_point
# [--let $counter= counter]
# [--let $info_table= info_table_name]
# [--let $gtids_after_stop= gtids after IO thread stopped]
# [--let $gtids_after_sync= gtids after sync IO/SQL thread]
# --source common/rpl/trx_boundary_parser_one_step.inc
#
# Parameters:
#   $table
#     The name of the table to insert data into.
#
#   $counter
#     The data that will be used in the INSERT statements.
#     If not specified, 0 will be used.
#
#   $debug_point
#     The debug point to be activated.
#
#   $info_table
#     The name of the table to insert information.
#     This table must have a column named "info" of VARCHAR(64) data type.
#

if (!$table)
{
  --die ERROR IN TEST: the mysqltest variable 'table' must be set
}
if (!$debug_point)
{
  --die ERROR IN TEST: the mysqltest variable 'debug_point' must be set
}
if (!$counter)
{
  --let $_counter= 0
}
if ($counter)
{
  --let $_counter= $counter
}

# Check if SQL thread is running
--source include/rpl/connection_replica.inc
--let $_is_sql_thread_running= query_get_value(SHOW REPLICA STATUS, Replica_SQL_Running, 1)

if ($info_table)
{
  # Inserting the debug point text into the info table
  --source include/rpl/connection_source.inc
  --eval INSERT INTO $info_table (info) VALUES ('$debug_point')
  # Make sure the debug_point will not be used by this INSERT
  --source include/rpl/sync_to_replica_received.inc
}

# Setting the debug sync point to stop IO thread
--let $debug_type= GLOBAL
--source include/add_debug_point.inc

# Inserting some data into master table $table
--source include/rpl/connection_source.inc
BEGIN;
--eval INSERT INTO $table VALUES (100 * $_counter + 1)
--eval SET @val= 100 * $_counter + 2
--eval INSERT INTO $table VALUES (@val)
COMMIT;

# Waiting for replica IO thread to stop
--source include/rpl/connection_replica.inc
--source include/rpl/wait_for_receiver_to_stop.inc

--source include/remove_debug_point.inc

# Check if the IO thread retrieved the correct amount of GTIDs
--let $gtid_step_count= $gtids_after_stop
# Ensure that the SQL thread is synced with the IO thread
# before asserting using slave's the GTID_EXECUTED.
if (!$assert_on_retrieved_gtid_set)
{
  --source include/rpl/sync_with_recieved.inc
}
--source $gtid_step_assert_include

# Inserting more data into master table $table
--source include/rpl/connection_source.inc
--eval INSERT INTO $table VALUES (100 * $_counter + 3)

# Restating slave IO thread
--source include/rpl/connection_replica.inc
--source include/rpl/start_receiver.inc

# Check if SQL thread was running before to sync it
if ( $_is_sql_thread_running == Yes )
{
  # Sync SQL thread
  --source include/rpl/connection_source.inc
  --source include/rpl/sync_to_replica.inc
}
# Else we sync only the IO thread
if ( $_is_sql_thread_running == No )
{
  # Sync IO thread
  --source include/rpl/connection_source.inc
  --source include/rpl/sync_to_replica_received.inc
}

# Check if the IO thread retrieved the correct amount of GTIDs
--let $gtid_step_count= $gtids_after_sync
--source $gtid_step_assert_include
